﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Mock.Dotnet.Utils
{
    public class RandomStringUtil
    {
        public static readonly List<string> csurname = new List<string>() {"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "楮", "卫", "蒋", "沈", "韩", "杨",
  "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜",
  "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎",
  "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐",
  "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常",
  "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄",
  "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧",
  "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "梁",
  "杜", "阮", "蓝", "闽", "席", "季", "麻", "强", "贾", "路", "娄", "危", "江", "童", "颜", "郭",
  "梅", "盛", "林", "刁", "锺", "徐", "丘", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍",
  "虞", "万", "支", "柯", "昝", "管", "卢", "莫", "经", "房", "裘", "缪", "干", "解", "应", "宗",
  "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉", "钮", "龚",
  "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀", "羊", "於", "惠", "甄", "麹", "家", "封",
  "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫", "乌", "焦", "巴", "弓",
  "牧", "隗", "山", "谷", "车", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宫",
  "宁", "仇", "栾", "暴", "甘", "斜", "厉", "戎", "祖", "武", "符", "刘", "景", "詹", "束", "龙",
  "叶", "幸", "司", "韶", "郜", "黎", "蓟", "薄", "印", "宿", "白", "怀", "蒲", "邰", "从", "鄂",
  "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙", "池", "乔", "阴", "郁", "胥", "能", "苍", "双",
  "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵", "冉", "宰", "郦", "雍",
  "郤", "璩", "桑", "桂", "濮", "牛", "寿", "通", "边", "扈", "燕", "冀", "郏", "浦", "尚", "农",
  "温", "别", "庄", "晏", "柴", "瞿", "阎", "充", "慕", "连", "茹", "习", "宦", "艾", "鱼", "容",
  "向", "古", "易", "慎", "戈", "廖", "庾", "终", "暨", "居", "衡", "步", "都", "耿", "满", "弘",
  "匡", "国", "文", "寇", "广", "禄", "阙", "东", "欧", "殳", "沃", "利", "蔚", "越", "夔", "隆",
  "师", "巩", "厍", "聂", "晁", "勾", "敖", "融", "冷", "訾", "辛", "阚", "那", "简", "饶", "空",
  "曾", "毋", "沙", "乜", "养", "鞠", "须", "丰", "巢", "关", "蒯", "相", "查", "后", "荆", "红",
  "游", "竺", "权", "逑", "盖", "益", "桓", "公", "仉", "督", "晋", "楚", "阎", "法", "汝", "鄢",
  "涂", "钦", "岳", "帅", "缑", "亢", "况", "后", "有", "琴", "归", "海", "墨", "哈", "谯", "笪",
  "年", "爱", "阳", "佟", "商", "牟", "佘", "佴", "伯", "赏",
  "万俟", "司马", "上官", "欧阳", "夏侯", "诸葛", "闻人", "东方", "赫连", "皇甫", "尉迟", "公羊",
  "澹台", "公冶", "宗政", "濮阳", "淳于", "单于", "太叔", "申屠", "公孙", "仲孙", "轩辕", "令狐",
  "锺离", "宇文", "长孙", "慕容", "鲜于", "闾丘", "司徒", "司空", "丌官", "司寇", "子车", "微生",
  "颛孙", "端木", "巫马", "公西", "漆雕", "乐正", "壤驷", "公良", "拓拔", "夹谷", "宰父", "谷梁",
  "段干", "百里", "东郭", "南门", "呼延", "羊舌", "梁丘", "左丘", "东门", "西门", "南宫"};

        public static readonly List<string> protocols = new List<string>() {
            "http",
            "ftp",
            "gopher",
            "mailto",
            "mid",
            "cid",
            "news",
            "nntp",
            "prospero",
            "telnet",
            "rlogin",
            "tn3270",
            "wais"
        };

        public static readonly string tlds = "com net org edu gov int mil cn " +
                // 国内域名
                "com.cn net.cn gov.cn org.cn " +
                // 中文国内域名
                "中国 中国互联.公司 中国互联.网络 " +
                // 新国际域名
                "tel biz cc tv info name hk mobi asia cd travel pro museum coop aero " +
                // 世界各国域名后缀
                "ad ae af ag ai al am an ao aq ar as at au aw az ba bb bd be bf bg bh bi bj bm bn bo br bs bt bv bw by bz ca cc cf cg ch ci ck cl cm cn co cq cr cu cv cx cy cz de dj dk dm do dz ec ee eg eh es et ev fi fj fk fm fo fr ga gb gd ge gf gh gi gl gm gn gp gr gt gu gw gy hk hm hn hr ht hu id ie il in io iq ir is it jm jo jp ke kg kh ki km kn kp kr kw ky kz la lb lc li lk lr ls lt lu lv ly ma mc md mg mh ml mm mn mo mp mq mr ms mt mv mw mx my mz na nc ne nf ng ni nl no np nr nt nu nz om qa pa pe pf pg ph pk pl pm pn pr pt pw py re ro ru rw sa sb sc sd se sg sh si sj sk sl sm sn so sr st su sy sz tc td tf tg th tj tk tm tn to tp tr tt tv tw tz ua ug uk us uy va vc ve vg vn vu wf ws ye yu za zm zr zw";

        private static readonly Random RANDOM = new Random();

        private static readonly String LETTERS = "abcdefghijklmnopqrstuvwxyz";

        private static readonly List<string> FirstNames = new List<string>() {
            "James", "John", "Robert", "Michael", "William",
            "David", "Richard", "Charles", "Joseph", "Thomas",
            "Christopher", "Daniel", "Paul", "Mark", "Donald",
            "George", "Kenneth", "Steven", "Edward", "Brian",
            "Ronald", "Anthony", "Kevin", "Jason", "Matthew",
            "Gary", "Timothy", "Jose", "Larry", "Jeffrey",
            "Frank", "Scott", "Eric","Mary", "Patricia", "Linda", "Barbara", "Elizabeth",
            "Jennifer", "Maria", "Susan", "Margaret", "Dorothy",
            "Lisa", "Nancy", "Karen", "Betty", "Helen",
            "Sandra", "Donna", "Carol", "Ruth", "Sharon",
            "Michelle", "Laura", "Sarah", "Kimberly", "Deborah",
            "Jessica", "Shirley", "Cynthia", "Angela", "Melissa",
            "Brenda", "Amy", "Anna"
        };

        private static readonly List<string> LastNames = new List<string>() {
        "Smith", "Johnson", "Williams", "Brown", "Jones",
            "Miller", "Davis", "Garcia", "Rodriguez", "Wilson",
            "Martinez", "Anderson", "Taylor", "Thomas", "Hernandez",
            "Moore", "Martin", "Jackson", "Thompson", "White",
            "Lopez", "Lee", "Gonzalez", "Harris", "Clark",
            "Lewis", "Robinson", "Walker", "Perez", "Hall",
            "Young", "Allen"
        };

        private static readonly List<string> REGIONS = new List<string>() {
            "东北", "华北", "华东", "华中", "华南", "西南", "西北"
        };

        public static String RandomCSureName()
        {
            return csurname[RANDOM.Next(csurname.Count)];
        }

        public static String RandomCFirstName()
        {
            return RandomChineseWords(RANDOM.Next(1, 3));
        }

        public static string RandomFirstName()
        {
            return FirstNames[RANDOM.Next(FirstNames.Count)];
        }

        public static string RandomLastName()
        {
            return LastNames[RANDOM.Next(LastNames.Count)];
        }

        public static string RandomName()
        {
            return FirstNames[RANDOM.Next(FirstNames.Count)] + " " + LastNames[RANDOM.Next(LastNames.Count)];
        }

        public static String RandomCName()
        {
            return RandomCSureName() + RandomCFirstName();
        }

        public static string RandomChineseWords(int count)
        {
            List<string> chineseWords = new List<string>();
            Random rm = new Random();
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
            Encoding gb = Encoding.GetEncoding("gb2312");

            for (int i = 0; i < count; i++)
            {
                // 获取区码(常用汉字的区码范围为16-55)
                int regionCode = rm.Next(16, 56);
                // 获取位码(位码范围为1-94 由于55区的90,91,92,93,94为空,故将其排除)
                int positionCode;
                if (regionCode == 55)
                {
                    // 55区排除90,91,92,93,94
                    positionCode = rm.Next(1, 90);
                }
                else
                {
                    positionCode = rm.Next(1, 95);
                }

                // 转换区位码为机内码
                int regionCode_Machine = regionCode + 160;// 160即为十六进制的20H+80H=A0H
                int positionCode_Machine = positionCode + 160;// 160即为十六进制的20H+80H=A0H

                // 转换为汉字
                byte[] bytes = new byte[] { (byte)regionCode_Machine, (byte)positionCode_Machine };
                chineseWords.Add(gb.GetString(bytes));
            }

            return String.Join("", chineseWords);
        }

        public static string RandomProtocol()
        {
            return protocols[RANDOM.Next(protocols.Count)];
        }

        public static string RandomTld()
        {
            var arr = tlds.Split(new char[] { ' ' });
            return arr[RANDOM.Next(arr.Length)];
        }

        public static string RandomString(int min, int max, string temp = null)
        {
            int length = RANDOM.Next(min, max + 1);
            StringBuilder sb = new StringBuilder();
            var arr = string.IsNullOrEmpty(temp) ? LETTERS.ToCharArray() : temp.ToCharArray();
            for (int i = 0; i < length; i++)
            {
                sb.Append(arr[RANDOM.Next(arr.Length)]);
            }
            return sb.ToString();
        }

        public static string RandomRegion()
        {
            return REGIONS[RANDOM.Next(REGIONS.Count)];
        }

        public static string RandomProvince()
        {
            return AddressDic.DICTS[RANDOM.Next(AddressDic.DICTS.Count)].name;
        }

        public static string RandomCity(bool prefix)
        {
            var province = AddressDic.DICTS[RANDOM.Next(AddressDic.DICTS.Count)];
            var city = province.children[RANDOM.Next(province.children.Count)];
            return prefix ? (province.name + " " + city.name) : city.name;
        }

        public static string RandomCounty(bool prefix)
        {
            var province = AddressDic.DICTS[RANDOM.Next(AddressDic.DICTS.Count)];
            var city = province.children[RANDOM.Next(province.children.Count)];
            var county = city.children.Count == 0 ? "-" : city.children[RANDOM.Next(city.children.Count)].name;
            return prefix ? (province.name + " " + city.name + " " + county) : county;
        }
    }
}